﻿using System;
using System.Collections.Generic;
using System.Linq;
using csvmb.contracts.datacontracts;
using NUnit.Framework;

namespace csvmb.gui.tests
{
    [TestFixture]
    public class ViewModelbauen
    {
        [Test]
        public void Einfaches_ViewModel_bauen() {
            var sut = new ViewModel_bauen();
            int count = 0;
            sut.Result += x => {
                count++;
                sut_Result(x);
            };

            sut.Process(
                new Tuple<IEnumerable<string>, Tuple<IEnumerable<Datensatz>, Tuple<long, long>>>(
                    new[] {"header1", "header2"},
                    new Tuple<IEnumerable<Datensatz>,Tuple<long, long>>(
                        new[] {
                            new Datensatz
                            {Spaltenwerte = new[] {"zeile1.1", "zeile1.2"}},
                            new Datensatz
                            {Spaltenwerte = new[] {"zeile2.1", "zeile2.2"}}
                        },
                        new Tuple
                            <long, long>(
                            1, 2))));

            Assert.That(count, Is.EqualTo(1));
        }

        private void sut_Result(ViewModel obj) {
            Assert.AreEqual(2, obj.Ausschnittanzahl);
            Assert.AreEqual(1, obj.Ausschnittsnummer);

            Assert.AreEqual(new[] {"header1", "header2"}, obj.Ausschnitt.Spaltennamen);

            Assert.AreEqual(new[] {"zeile1.1", "zeile1.2"}, obj.Ausschnitt.Datensaetze.ToArray()[0].Spaltenwerte);

            Assert.AreEqual(new[] { "zeile2.1", "zeile2.2" } , obj.Ausschnitt.Datensaetze.ToArray()[1].Spaltenwerte);
            
        }



            //Assert.AreEqual(new[] {"zeile2.1", "zeile2.2"}, obj.Ausschnitt.Datensaetze.ToArray()[1].Spaltenwerte);


        [Test]
        public void Blaettern_ViewModel_bauen()
        {
            ViewModel_bauen sut = new ViewModel_bauen();
            sut.Result += Blaettern_Result;

            sut.Process(
                new Tuple<IEnumerable<string>, Tuple<IEnumerable<Datensatz>, Tuple<long, long>>>(new string[] { "header1", "header2" },
                                                                                                 new Tuple
                                                                                                     <
                                                                                                     IEnumerable
                                                                                                     <Datensatz>,
                                                                                                     Tuple<long, long>>(
                                                                                                     new Datensatz[]
                                                                                                         {
                                                                                                             new Datensatz
                                                                                                                 { Spaltenwerte = new[] { "zeile1.1", "zeile1.2" }},
                                                                                                             new Datensatz 
                                                                                                                 { Spaltenwerte = new[] { "zeile2.1", "zeile2.2" }}
                                                                                                         },
                                                                                                     new Tuple
                                                                                                         <long, long>(
                                                                                                         2, 1))));

        }

        void Blaettern_Result(ViewModel obj)
        {
            Assert.AreEqual(2, obj.Ausschnittanzahl);
            Assert.AreEqual(1, obj.Ausschnittsnummer);

            Assert.AreEqual(new string[] { "header1", "header2" }, obj.Ausschnitt.Spaltennamen);

            Assert.AreEqual(new[] { "zeile1.1", "zeile1.2" }, obj.Ausschnitt.Datensaetze.ToArray()[0].Spaltenwerte);
            Assert.AreEqual(new[] { "zeile2.1", "zeile2.2" }, obj.Ausschnitt.Datensaetze.ToArray()[1].Spaltenwerte);


            Assert.AreEqual(false, obj.Blättern_an_den_Anfang_erlaubt);
            Assert.AreEqual(false, obj.Blättern_zurück_erlaubt);
            Assert.AreEqual(true,obj.Blättern_an_das_Ende_erlaubt);
            Assert.AreEqual(true, obj.Blättern_weiter_erlaubt);

        }
    }
}